package cn.tedu.justone.pack02;

/**
 * ZZ：JustOne
 * VX：Andylau2020smile
 * DY：JustOne2018
 * ZT：《》
 */
public class Demo10_2_案例测试synchronized锁不同对象 {
    public static void main(String[] args) {
        //案例测试synchronized锁不同对象
        //案例测试synchronized锁不同对象
        //案例测试synchronized锁不同对象
        //1,当synchronized用在普通方法上时，锁对象是当前实例。
        //2,如果我只创建一个Table对象，就只有一个实例，两条线程面临的是同一个锁对象，线程安全
        //  如果我创建了两个Table对象，就会有两个实例，两条线程面临的是不同的锁对象，线程不安全

        Table table1 = new Table();
        Table table2 = new Table();
        new Thread(){
            @Override
            public void run() {
                while(table1.mi>0){
                    table1.eatMi();
                }
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                while(table2.mi>0){
                    table2.eatMi();
                }
            }
        }.start();
    }
}

class Table{
    static int mi = 5;

    public synchronized void eatMi(){
        if(mi>0){
            mySleep(10);
            mi--;
            System.out.println("剩余数量：" + mi);
        }
    }

    //为了让代码更优雅，编写统一的休眠方法
    public static void mySleep(long m){
        try {
            Thread.sleep(m);
        } catch (InterruptedException e) {
            System.out.println("You：谁喊我？");
            e.printStackTrace();
        }
    }

}
